package com.kly.sc.api.application.controller.im.request;

import com.fqgj.common.api.ParamsObject;
import com.kly.sc.api.application.enums.MsgType;
import com.kly.sc.api.application.utils.ValidateParams;
import lombok.Data;

import java.util.Objects;

/**
 * 消息体
 * @author linqu
 */
@Data
public class SendMessageRequest extends ParamsObject {
    /**
     * 发送人用户 ID。
     * 注意：发送消息所使用的用户ID必须已获取过用户 Token，否则消息一旦触发离线推送，
     * 通知内无法正确显示发送者的用户信息。
     */
    private String conversationType;
    /**
     * 接收用户ID，可以实现向多人发送消息，每次上限为 1000 人
     */
    private String userCodeFriend;

    /**
     * 消息类型，接受内置消息类型（见消息类型概述）或自定义消息的消息类型值。
     *
     * 消息类型	    ObjectName
     * 文本	        RC:TxtMsg
     * 高清语音消息	RC:HQVCMsg
     * 图片消息	    RC:ImgMsg
     * GIF 图片消息	RC:GIFMsg
     * 图文消息	    RC:ImgTextMsg
     * 文件消息	    RC:FileMsg
     * 位置消息	    RC:LBSMsg
     * 小视频消息	    RC:SightMsg
     * 引用消息	    RC:ReferenceMsg
     * 合并转发消息	RC:CombineMsg
     */
    private String objectName;

    /**
     * 所发送消息的内容，单条消息最大 128k
     * 1) 内置消息类型：将消息内容体 JSON 对象序列化为 JSON 字符串传入。
     * 消息内容 JSON 结构体详见用户内容类消息格式或其他内置消息类型的消息内容格式。
     * 例如，文本消息内容 JSON 结构体内部包含 content 字段（此为 JSON 结构体内的 key 值，注意区分），
     * 则需要将 {“content”:”Hello world!”} 序列化后的结果作为此处 content 字段的值。
     *
     * 2) 自定义消息类型（objectName 字段必须指定为自定义消息类型）：如果发送自定义消息，
     * 该参数可自定义格式，不限于 JSON。
     */
    private String content;

    /**
     * 指定离线推送通知中的推送内容。
     * 1)如果消息类型（objectName 字段）为融云内置消息类型，可不填写该字段，离线推送通知中会自动包含该
     * 内置消息类型默认的推送内容（见用户内容类消息格式或其他内置消息类型的「推送内容」）。
     * 2)如果消息类型为自定义消息类型，且需要支持离线推送通知，则必须填写 pushContent 字段，否则用户无
     * 法收到离线推送通知。
     * 3)如果消息类型为自定义消息类型，但不需要支持离线推送通知（例如通过自定义消息类型实现的 App 业务层操作指令），
     * 可将 pushContent 字段留空禁用离线推送。
     * 注意：自定义消息如需支持离线推送，则必须填写该字段，否则用户无法收到离线推送通知。
     */
    private String pushContent;


    @Override
    public void validate() {
        ValidateParams.notEmpty(this.conversationType, "The params [conversationType] should not be empty");
        ValidateParams.notEmpty(this.userCodeFriend, "The params [userCodeFriend] should not be empty");
        ValidateParams.notEmpty(this.objectName, "The params [objectName] should not be empty");
        ValidateParams.notEmpty(this.content, "The params [content] should not be empty");
        ValidateParams.assertTrue(Objects.isNull(MsgType.fromType(this.getObjectName())), "The params [objectName] validate failed");
    }
}
